# -*-codeing = utf-8 -*-
# @Time: 2025/7/9 16:45
# @Author : 邓佳丽
# @File : 250710.py
# @Software : PyCharm

#对象：某个类型中的具体的个体/实例：郭德纲、正在使用的手机
#类：一类东西的统称：模块
#面向对象：先找到问题中的各种"东西"（对象），然后给它们分类建模板（类），最后用模板造出具体东西（对象）来解决问题。

#类的定义语法
# class 类名(继承列表)：
#     "类的文档字符串"
#      实例方法 method：登录,注册
#      类变量
#      类的方法
#      静态方法
# 作用：当做模版来创建对象
#      用来描述该类的对象具备的行为和属性

#每一个对象有自己的作用域和名字空间，还可以为自己的对象添加一个实例对象
#对象可以访问类变量，实例变量，类方法，实例方法
# def 班级():
#     校长='张三'  #类变量
#     def __init__(self,str): #实例变量
#         self.班长=str
#     @classmethod   #类方法
#     def 开学(self):
#         pass
# banji1=班级('李四')      #banji1是实例
# banji2=班级('王五')
#
# print(banji1.校长)
# print(banji2.班长)
# print(banji1.班长)
# print(banji1.开学)


#实例方法(对象级别，实例级别，我需要创实例在调用)：所有对象具备的行为，每个对象都有单独的空间
# def 实例方法名(self,参数1，参数2....)
#     "实例方法文档字符串"
#     实例方法体
# 调用：对象.实例方法名(参数1，参数2...)或者
#      类名.实例方法名（实例，参数1，参数2）

#实例变量（属性）
# 每一个实例都具备的变量
# 调用：对象.属性名
# 首次为对象的属性进行赋值，就是创次对象
# 以后的再此复制就是修改


#创建一个学生类
# class Student():
#     def set_info(self,name,age=0):
#         '设置学生的相关属性'
#         self.name=name
#         self.age=age
#     def show_info(self):
#          print('学生的信息',self.name,self.age)
#
# student1=Student()
# student2=Student()
# student1.set_info('郭德纲','18')
# student1.show_info()
# student2.set_info('张三','19')
# student2.show_info()
# # del student1.name
# # student1.show_info()
#
# #初始化方法
# #作用：创建对象时会自动调用，一般作为对象的属性初始化
# def __init__(self,参数列表):
#     pass
# #方法的名字必须是__init__，形参中一个形参必须是self，没有返回值，只能返回none
#
#
# #析构方法
# def __del__(self):
#     pass
# #析构方法会在对象销毁的时候被调用，面向对象领域中用于清理对象资源的特殊方法

class Human():
    def __init__(self,name,age,money):
        self.name=name
        self.age=age
        self.money=money
    def teach(self,other,skill):
        print(self.name,'教',other.name,'学了',skill)
    def work(self,hours):
        self.money+=hours*100
        print(self.name,'工作了',hours,'小时，赚了',hours*100,'元钱')

    def borrow(self,other,sum):
        if other.money>=sum:
            self.money+=sum
            other.money-=sum
            print(self.name,'向',other.name,'借了',sum,'元钱')
        else:
            print('不借')
    def show_info(self):
        print(self.name,'有',self.money,'元存款')


zs=Human('张三',19,100)
ls=Human('李四',18,20)
zs.show_info()
ls.show_info()
zs.teach(ls,"python")
ls.teach(zs,'java')
zs.work(6)
zs.borrow(ls,10)

#isinstance(obj,class)  :判断对象是不是某一个类型的实例
#类变量：一般用来记录类的相关数据，
# 可以通过__class__属性的方式访问
class Car():
    count=0
    def __init__(self):
        self.__class__.count+=1
    def __del__(self):
        self.__class__.count-=1
print(Car.count)
car=Car()
print(car.count)
print(car.__class__.count)

#实例不能直接访问类变量，需要通过__class__
#类的文档字符串
#__doc__属性中

#__slots__属性
#__slots__是类的一个属性，是一个列表，限定了这个类的实例只能有哪些属性
class Dog():
    __slots__=['kind','age']
    def __init__(self,kind,age):
        self.kind=kind
        self.age=age
dog=Dog('哈士奇',3)
print(dog.__dict__)
dog.name='旺财'

#类方法是描述该类的具备的行为，不属于某一个对象，所有的对象可以访问
#在前面加一个装饰器@classmethod，类方法最少需要一个形参，这个形参绑定的是类，一般写作cls
